<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/alternative.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/alternative.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfQUxURVJOQVRJVkVfSF8w"><span class="b">_ASM_X86_ALTERNATIVE_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfQUxURVJOQVRJVkVfSF8w"><span class="b">_ASM_X86_ALTERNATIVE_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">stddef</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">stringify</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="m">asm</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">ptrace</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="9" /><span class="Maybe">       9:</span> 
<a name="10" /><span class="Maybe">      10:</span> <span class="k">/*</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="k"> * Alternative inline assembly for SMP.</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="k"> *</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="k"> * The LOCK_PREFIX macro defined here replaces the LOCK and</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="k"> * LOCK_PREFIX macros used everywhere in the source tree.</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="k"> *</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="k"> * SMP alternatives use the same data structures as the other</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k"> * alternatives and the X86_FEATURE_UP flag to indicate the case of a</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * UP system running a SMP kernel.  The existing apply_alternatives()</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> * works fine for patching a SMP kernel for UP.</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> *</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * The SMP alternative tables can be kept after boot and contain both</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * UP and SMP versions of the instructions to allow switching back to</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> * SMP at runtime, when hotplugging in a new CPU, which is especially</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * useful in virtualized environments.</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> *</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> * The very common lock prefix is handled as special case in a</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> * separate table which is a pure address list without replacement ptr</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> * and size information.  That keeps the table sizes small.</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> */</span>
<a name="30" /><span class="Maybe">      30:</span> 
<a name="31" /><span class="Maybe">      31:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="32" /><span class="Maybe">      32:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfSEVSRV8w"><span class="b">LOCK_PREFIX_HERE</span></a> \
<a name="33" /><span class="Maybe">      33:</span>         <span class="e">&quot;.pushsection .smp_locks,\&quot;a\&quot;\n&quot;</span>    \
<a name="34" /><span class="Maybe">      34:</span>         <span class="e">&quot;.balign 4\n&quot;</span>                \
<a name="35" /><span class="Maybe">      35:</span>         <span class="e">&quot;.long 671f - .\n&quot;</span> <span class="k">/* offset */</span>        \
<a name="36" /><span class="Maybe">      36:</span>         <span class="e">&quot;.popsection\n&quot;</span>                \
<a name="37" /><span class="Maybe">      37:</span>         <span class="e">&quot;671:&quot;</span>
<a name="38" /><span class="Maybe">      38:</span> 
<a name="39" /><span class="Maybe">      39:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfSEVSRV8w"><span class="b">LOCK_PREFIX_HERE</span></a> <span class="e">&quot;\n\tlock; &quot;</span>
<a name="40" /><span class="Maybe">      40:</span> 
<a name="41" /><span class="False">      41:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* ! CONFIG_SMP */</span>
<a name="42" /><span class="False">      42:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfSEVSRV8w"><span class="b">LOCK_PREFIX_HERE</span></a> <span class="e">&quot;&quot;</span>
<a name="43" /><span class="False">      43:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;&quot;</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="f">#</span><span class="n">endif</span>
<a name="45" /><span class="Maybe">      45:</span> 
<a name="46" /><span class="Maybe">      46:</span> <span class="m">struct</span> <span class="b">alt_instr</span> <span class="f">{</span>
<a name="47" /><span class="Maybe">      47:</span>     <span class="b">s32</span> <span class="b">instr_offset</span><span class="f">;</span>    <span class="k">/* original instruction */</span>
<a name="48" /><span class="Maybe">      48:</span>     <span class="b">s32</span> <span class="b">repl_offset</span><span class="f">;</span>    <span class="k">/* offset to replacement instruction */</span>
<a name="49" /><span class="Maybe">      49:</span>     <span class="b">u16</span> <span class="b">cpuid</span><span class="f">;</span>        <span class="k">/* cpuid bit set for replacement */</span>
<a name="50" /><span class="Maybe">      50:</span>     <span class="b">u8</span>  <span class="b">instrlen</span><span class="f">;</span>        <span class="k">/* length of original instruction */</span>
<a name="51" /><span class="Maybe">      51:</span>     <span class="b">u8</span>  <span class="b">replacementlen</span><span class="f">;</span>    <span class="k">/* length of new instruction, &lt;= instrlen */</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="f">}</span><span class="f">;</span>
<a name="53" /><span class="Maybe">      53:</span> 
<a name="54" /><span class="Maybe">      54:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">alternative_instructions</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">apply_alternatives</span><span class="f">(</span><span class="m">struct</span> <span class="b">alt_instr</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span> <span class="m">struct</span> <span class="b">alt_instr</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span> 
<a name="57" /><span class="Maybe">      57:</span> <span class="m">struct</span> <span class="b">module</span><span class="f">;</span>
<a name="58" /><span class="Maybe">      58:</span> 
<a name="59" /><span class="Maybe">      59:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="60" /><span class="Maybe">      60:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">alternatives_smp_module_add</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">,</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">,</span>
<a name="61" /><span class="Maybe">      61:</span>                     <span class="m">void</span> <span class="f">*</span><span class="b">locks</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">locks_end</span><span class="f">,</span>
<a name="62" /><span class="Maybe">      62:</span>                     <span class="m">void</span> <span class="f">*</span><span class="b">text</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">text_end</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">alternatives_smp_module_del</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">)</span><span class="f">;</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">alternatives_enable_smp</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">alternatives_text_reserved</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="m">extern</span> <span class="m">bool</span> <span class="b">skip_smp_alternatives</span><span class="f">;</span>
<a name="67" /><span class="False">      67:</span> <span class="f">#</span><span class="n">else</span>
<a name="68" /><span class="False">      68:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">alternatives_smp_module_add</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">,</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">,</span>
<a name="69" /><span class="False">      69:</span>                            <span class="m">void</span> <span class="f">*</span><span class="b">locks</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">locks_end</span><span class="f">,</span>
<a name="70" /><span class="False">      70:</span>                            <span class="m">void</span> <span class="f">*</span><span class="b">text</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">text_end</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="71" /><span class="False">      71:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">alternatives_smp_module_del</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="72" /><span class="False">      72:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">alternatives_enable_smp</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="73" /><span class="False">      73:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">alternatives_text_reserved</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span>
<a name="74" /><span class="False">      74:</span> <span class="f">{</span>
<a name="75" /><span class="False">      75:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="76" /><span class="False">      76:</span> <span class="f">}</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* CONFIG_SMP */</span>
<a name="78" /><span class="Maybe">      78:</span> 
<a name="79" /><span class="Maybe">      79:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_T0xESU5TVFJfMA__"><span class="b">OLDINSTR</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">)</span>    <span class="e">&quot;661:\n\t&quot;</span> <span class="b">oldinstr</span> <span class="e">&quot;\n662:\n&quot;</span>
<a name="80" /><span class="Maybe">      80:</span> 
<a name="81" /><span class="Maybe">      81:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Yl9yZXBsYWNlbWVudF8w"><span class="b">b_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span>    <span class="e">&quot;663&quot;</span><span class="f">#</span><span class="b">number</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_ZV9yZXBsYWNlbWVudF8w"><span class="b">e_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span>    <span class="e">&quot;664&quot;</span><span class="f">#</span><span class="b">number</span>
<a name="83" /><span class="Maybe">      83:</span> 
<a name="84" /><span class="Maybe">      84:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0X3NsZW5fMA__"><span class="b">alt_slen</span></a> <span class="e">&quot;662b-661b&quot;</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0X3JsZW5fMA__"><span class="b">alt_rlen</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_ZV9yZXBsYWNlbWVudF8w"><span class="b">e_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span><span class="e">&quot;f-&quot;</span><a href="cpu.c_macros_ref.html#_Yl9yZXBsYWNlbWVudF8w"><span class="b">b_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span><span class="e">&quot;f&quot;</span>
<a name="86" /><span class="Maybe">      86:</span> 
<a name="87" /><span class="Maybe">      87:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfRU5UUllfMA__"><span class="b">ALTINSTR_ENTRY</span></a><span class="f">(</span><span class="b">feature</span><span class="f">,</span> <span class="b">number</span><span class="f">)</span>                          \
<a name="88" /><span class="Maybe">      88:</span>     <span class="e">&quot; .long 661b - .\n&quot;</span>                <span class="k">/* label           */</span> \
<a name="89" /><span class="Maybe">      89:</span>     <span class="e">&quot; .long &quot;</span> <a href="cpu.c_macros_ref.html#_Yl9yZXBsYWNlbWVudF8w"><span class="b">b_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span><span class="e">&quot;f - .\n&quot;</span>    <span class="k">/* new instruction */</span> \
<a name="90" /><span class="Maybe">      90:</span>     <span class="e">&quot; .word &quot;</span> <a href="cpu.c_macros_ref.html#_X19zdHJpbmdpZnlfMA__"><span class="b">__stringify</span></a><span class="f">(</span><span class="b">feature</span><span class="f">)</span> <span class="e">&quot;\n&quot;</span>        <span class="k">/* feature bit     */</span> \
<a name="91" /><span class="Maybe">      91:</span>     <span class="e">&quot; .byte &quot;</span> <a href="cpu.c_macros_ref.html#_YWx0X3NsZW5fMA__"><span class="b">alt_slen</span></a> <span class="e">&quot;\n&quot;</span>                <span class="k">/* source len      */</span> \
<a name="92" /><span class="Maybe">      92:</span>     <span class="e">&quot; .byte &quot;</span> <a href="cpu.c_macros_ref.html#_YWx0X3JsZW5fMA__"><span class="b">alt_rlen</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span> <span class="e">&quot;\n&quot;</span>            <span class="k">/* replacement len */</span>
<a name="93" /><span class="Maybe">      93:</span> 
<a name="94" /><span class="Maybe">      94:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_RElTQ0FSRF9FTlRSWV8w"><span class="b">DISCARD_ENTRY</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span>                <span class="k">/* rlen &lt;= slen */</span>    \
<a name="95" /><span class="Maybe">      95:</span>     <span class="e">&quot; .byte 0xff + (&quot;</span> <a href="cpu.c_macros_ref.html#_YWx0X3JsZW5fMA__"><span class="b">alt_rlen</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span> <span class="e">&quot;) - (&quot;</span> <a href="cpu.c_macros_ref.html#_YWx0X3NsZW5fMA__"><span class="b">alt_slen</span></a> <span class="e">&quot;)\n&quot;</span>
<a name="96" /><span class="Maybe">      96:</span> 
<a name="97" /><span class="Maybe">      97:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfUkVQTEFDRU1FTlRfMA__"><span class="b">ALTINSTR_REPLACEMENT</span></a><span class="f">(</span><span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">,</span> <span class="b">number</span><span class="f">)</span>    <span class="k">/* replacement */</span>     \
<a name="98" /><span class="Maybe">      98:</span>     <a href="cpu.c_macros_ref.html#_Yl9yZXBsYWNlbWVudF8w"><span class="b">b_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span><span class="e">&quot;:\n\t&quot;</span> <span class="b">newinstr</span> <span class="e">&quot;\n&quot;</span> <a href="cpu.c_macros_ref.html#_ZV9yZXBsYWNlbWVudF8w"><span class="b">e_replacement</span></a><span class="f">(</span><span class="b">number</span><span class="f">)</span> <span class="e">&quot;:\n\t&quot;</span>
<a name="99" /><span class="Maybe">      99:</span> 
<a name="100" /><span class="Maybe">     100:</span> <span class="k">/* alternative assembly primitive: */</span>
<a name="101" /><span class="Maybe">     101:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span>            \
<a name="102" /><span class="Maybe">     102:</span>     <a href="cpu.c_macros_ref.html#_T0xESU5TVFJfMA__"><span class="b">OLDINSTR</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">)</span>                        \
<a name="103" /><span class="Maybe">     103:</span>     <span class="e">&quot;.pushsection .altinstructions,\&quot;a\&quot;\n&quot;</span>                \
<a name="104" /><span class="Maybe">     104:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfRU5UUllfMA__"><span class="b">ALTINSTR_ENTRY</span></a><span class="f">(</span><span class="b">feature</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span>                    \
<a name="105" /><span class="Maybe">     105:</span>     <span class="e">&quot;.popsection\n&quot;</span>                            \
<a name="106" /><span class="Maybe">     106:</span>     <span class="e">&quot;.pushsection .discard,\&quot;aw\&quot;,@progbits\n&quot;</span>            \
<a name="107" /><span class="Maybe">     107:</span>     <a href="cpu.c_macros_ref.html#_RElTQ0FSRF9FTlRSWV8w"><span class="b">DISCARD_ENTRY</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span>                        \
<a name="108" /><span class="Maybe">     108:</span>     <span class="e">&quot;.popsection\n&quot;</span>                            \
<a name="109" /><span class="Maybe">     109:</span>     <span class="e">&quot;.pushsection .altinstr_replacement, \&quot;ax\&quot;\n&quot;</span>            \
<a name="110" /><span class="Maybe">     110:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfUkVQTEFDRU1FTlRfMA__"><span class="b">ALTINSTR_REPLACEMENT</span></a><span class="f">(</span><span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span>            \
<a name="111" /><span class="Maybe">     111:</span>     <span class="e">&quot;.popsection&quot;</span>
<a name="112" /><span class="Maybe">     112:</span> 
<a name="113" /><span class="Maybe">     113:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMl8w"><span class="b">ALTERNATIVE_2</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr1</span><span class="f">,</span> <span class="b">feature1</span><span class="f">,</span> <span class="b">newinstr2</span><span class="f">,</span> <span class="b">feature2</span><span class="f">)\
</span>    <a href="cpu.c_macros_ref.html#_T0xESU5TVFJfMA__"><span class="b">OLDINSTR</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">)</span>                        \
<a name="115" /><span class="Maybe">     115:</span>     <span class="e">&quot;.pushsection .altinstructions,\&quot;a\&quot;\n&quot;</span>                \
<a name="116" /><span class="Maybe">     116:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfRU5UUllfMA__"><span class="b">ALTINSTR_ENTRY</span></a><span class="f">(</span><span class="b">feature1</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span>                    \
<a name="117" /><span class="Maybe">     117:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfRU5UUllfMA__"><span class="b">ALTINSTR_ENTRY</span></a><span class="f">(</span><span class="b">feature2</span><span class="f">,</span> <span class="c">2</span><span class="f">)</span>                    \
<a name="118" /><span class="Maybe">     118:</span>     <span class="e">&quot;.popsection\n&quot;</span>                            \
<a name="119" /><span class="Maybe">     119:</span>     <span class="e">&quot;.pushsection .discard,\&quot;aw\&quot;,@progbits\n&quot;</span>            \
<a name="120" /><span class="Maybe">     120:</span>     <a href="cpu.c_macros_ref.html#_RElTQ0FSRF9FTlRSWV8w"><span class="b">DISCARD_ENTRY</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span>                        \
<a name="121" /><span class="Maybe">     121:</span>     <a href="cpu.c_macros_ref.html#_RElTQ0FSRF9FTlRSWV8w"><span class="b">DISCARD_ENTRY</span></a><span class="f">(</span><span class="c">2</span><span class="f">)</span>                        \
<a name="122" /><span class="Maybe">     122:</span>     <span class="e">&quot;.popsection\n&quot;</span>                            \
<a name="123" /><span class="Maybe">     123:</span>     <span class="e">&quot;.pushsection .altinstr_replacement, \&quot;ax\&quot;\n&quot;</span>            \
<a name="124" /><span class="Maybe">     124:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfUkVQTEFDRU1FTlRfMA__"><span class="b">ALTINSTR_REPLACEMENT</span></a><span class="f">(</span><span class="b">newinstr1</span><span class="f">,</span> <span class="b">feature1</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span>            \
<a name="125" /><span class="Maybe">     125:</span>     <a href="cpu.c_macros_ref.html#_QUxUSU5TVFJfUkVQTEFDRU1FTlRfMA__"><span class="b">ALTINSTR_REPLACEMENT</span></a><span class="f">(</span><span class="b">newinstr2</span><span class="f">,</span> <span class="b">feature2</span><span class="f">,</span> <span class="c">2</span><span class="f">)</span>            \
<a name="126" /><span class="Maybe">     126:</span>     <span class="e">&quot;.popsection&quot;</span>
<a name="127" /><span class="Maybe">     127:</span> 
<a name="128" /><span class="Maybe">     128:</span> <span class="k">/*</span>
<a name="129" /><span class="Maybe">     129:</span> <span class="k"> * This must be included *after* the definition of ALTERNATIVE due to</span>
<a name="130" /><span class="Maybe">     130:</span> <span class="k"> * &lt;asm/arch_hweight.h&gt;</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="k"> */</span>
<a name="132" /><span class="Maybe">     132:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cpufeature</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="133" /><span class="Maybe">     133:</span> 
<a name="134" /><span class="Maybe">     134:</span> <span class="k">/*</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="k"> * Alternative instructions for different CPU types or capabilities.</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="k"> *</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="k"> * This allows to use optimized instructions even on generic binary</span>
<a name="138" /><span class="Maybe">     138:</span> <span class="k"> * kernels.</span>
<a name="139" /><span class="Maybe">     139:</span> <span class="k"> *</span>
<a name="140" /><span class="Maybe">     140:</span> <span class="k"> * length of oldinstr must be longer or equal the length of newinstr</span>
<a name="141" /><span class="Maybe">     141:</span> <span class="k"> * It can be padded with nops as needed.</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="k"> *</span>
<a name="143" /><span class="Maybe">     143:</span> <span class="k"> * For non barrier like inlines please define new variants</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="k"> * without volatile and memory clobber.</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="k"> */</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfMA__"><span class="b">alternative</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span>            \
<a name="147" /><span class="Maybe">     147:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span> <span class="f">:</span> <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span>
<a name="148" /><span class="Maybe">     148:</span> 
<a name="149" /><span class="Maybe">     149:</span> <span class="k">/*</span>
<a name="150" /><span class="Maybe">     150:</span> <span class="k"> * Alternative inline assembly with input.</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="k"> *</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="k"> * Pecularities:</span>
<a name="153" /><span class="Maybe">     153:</span> <span class="k"> * No memory clobber here.</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="k"> * Argument numbers start with 1.</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="k"> * Best is to use constraints that are fixed size (like (%1) ... &quot;r&quot;)</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="k"> * If you use variable sized constraints like &quot;m&quot; or &quot;g&quot; in the</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="k"> * replacement make sure to pad to the worst case length.</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="k"> * Leaving an unused argument 0 to keep API compatibility.</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="k"> */</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfaW5wdXRfMA__"><span class="b">alternative_input</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">,</span> <span class="b">input</span><span class="f">...</span><span class="f">)</span>    \
<a name="161" /><span class="Maybe">     161:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span>        \
<a name="162" /><span class="Maybe">     162:</span>         <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="f">##</span> <span class="b">input</span><span class="f">)</span>
<a name="163" /><span class="Maybe">     163:</span> 
<a name="164" /><span class="Maybe">     164:</span> <span class="k">/* Like alternative_input, but with a single output argument */</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfaW9fMA__"><span class="b">alternative_io</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">,</span> <span class="b">output</span><span class="f">,</span> <span class="b">input</span><span class="f">...</span><span class="f">)</span>    \
<a name="166" /><span class="Maybe">     166:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="b">oldinstr</span><span class="f">,</span> <span class="b">newinstr</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span>        \
<a name="167" /><span class="Maybe">     167:</span>         <span class="f">:</span> <span class="b">output</span> <span class="f">:</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="f">##</span> <span class="b">input</span><span class="f">)</span>
<a name="168" /><span class="Maybe">     168:</span> 
<a name="169" /><span class="Maybe">     169:</span> <span class="k">/* Like alternative_io, but for replacing a direct call with another one. */</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_YWx0ZXJuYXRpdmVfY2FsbF8w"><span class="b">alternative_call</span></a><span class="f">(</span><span class="b">oldfunc</span><span class="f">,</span> <span class="b">newfunc</span><span class="f">,</span> <span class="b">feature</span><span class="f">,</span> <span class="b">output</span><span class="f">,</span> <span class="b">input</span><span class="f">...</span><span class="f">)</span>    \
<a name="171" /><span class="Maybe">     171:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="e">&quot;call %P[old]&quot;</span><span class="f">,</span> <span class="e">&quot;call %P[new]&quot;</span><span class="f">,</span> <span class="b">feature</span><span class="f">)</span> \
<a name="172" /><span class="Maybe">     172:</span>         <span class="f">:</span> <span class="b">output</span> <span class="f">:</span> <span class="f">[</span><span class="b">old</span><span class="f">]</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">oldfunc</span><span class="f">)</span><span class="f">,</span> <span class="f">[</span><span class="m">new</span><span class="f">]</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">newfunc</span><span class="f">)</span><span class="f">,</span> <span class="f">##</span> <span class="b">input</span><span class="f">)</span>
<a name="173" /><span class="Maybe">     173:</span> 
<a name="174" /><span class="Maybe">     174:</span> <span class="k">/*</span>
<a name="175" /><span class="Maybe">     175:</span> <span class="k"> * Like alternative_call, but there are two features and respective functions.</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="k"> * If CPU has feature2, function2 is used.</span>
<a name="177" /><span class="Maybe">     177:</span> <span class="k"> * Otherwise, if CPU has feature1, function1 is used.</span>
<a name="178" /><span class="Maybe">     178:</span> <span class="k"> * Otherwise, old function is used.</span>
<a name="179" /><span class="Maybe">     179:</span> <span class="k"> */</span>
<a name="180" /><span class="Maybe">     180:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfY2FsbF8yXzA_"><span class="b">alternative_call_2</span></a><span class="f">(</span><span class="b">oldfunc</span><span class="f">,</span> <span class="b">newfunc1</span><span class="f">,</span> <span class="b">feature1</span><span class="f">,</span> <span class="b">newfunc2</span><span class="f">,</span> <span class="b">feature2</span><span class="f">,</span>   \
<a name="181" /><span class="Maybe">     181:</span>                <span class="b">output</span><span class="f">,</span> <span class="b">input</span><span class="f">...</span><span class="f">)</span>                      \
<a name="182" /><span class="Maybe">     182:</span>     <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMl8w"><span class="b">ALTERNATIVE_2</span></a><span class="f">(</span><span class="e">&quot;call %P[old]&quot;</span><span class="f">,</span> <span class="e">&quot;call %P[new1]&quot;</span><span class="f">,</span> <span class="b">feature1</span><span class="f">,\
</span>        <span class="e">&quot;call %P[new2]&quot;</span><span class="f">,</span> <span class="b">feature2</span><span class="f">)</span>                      \
<a name="184" /><span class="Maybe">     184:</span>         <span class="f">:</span> <span class="b">output</span> <span class="f">:</span> <span class="f">[</span><span class="b">old</span><span class="f">]</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">oldfunc</span><span class="f">)</span><span class="f">,</span> <span class="f">[</span><span class="b">new1</span><span class="f">]</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">newfunc1</span><span class="f">)</span><span class="f">,</span>          \
<a name="185" /><span class="Maybe">     185:</span>         <span class="f">[</span><span class="b">new2</span><span class="f">]</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">newfunc2</span><span class="f">)</span><span class="f">,</span> <span class="f">##</span> <span class="b">input</span><span class="f">)</span>
<a name="186" /><span class="Maybe">     186:</span> 
<a name="187" /><span class="Maybe">     187:</span> <span class="k">/*</span>
<a name="188" /><span class="Maybe">     188:</span> <span class="k"> * use this macro(s) if you need more than one output parameter</span>
<a name="189" /><span class="Maybe">     189:</span> <span class="k"> * in alternative_io</span>
<a name="190" /><span class="Maybe">     190:</span> <span class="k"> */</span>
<a name="191" /><span class="Maybe">     191:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QVNNX09VVFBVVDJfMA__"><span class="b">ASM_OUTPUT2</span></a><span class="f">(</span><span class="b">a</span><span class="f">...</span><span class="f">)</span> <span class="b">a</span>
<a name="192" /><span class="Maybe">     192:</span> 
<a name="193" /><span class="Maybe">     193:</span> <span class="k">/*</span>
<a name="194" /><span class="Maybe">     194:</span> <span class="k"> * use this macro if you need clobbers but no inputs in</span>
<a name="195" /><span class="Maybe">     195:</span> <span class="k"> * alternative_{input,io,call}()</span>
<a name="196" /><span class="Maybe">     196:</span> <span class="k"> */</span>
<a name="197" /><span class="Maybe">     197:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVNNX05PX0lOUFVUX0NMT0JCRVJfMA__"><span class="b">ASM_NO_INPUT_CLOBBER</span></a><span class="f">(</span><span class="b">clbr</span><span class="f">...</span><span class="f">)</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span> <span class="f">:</span> <span class="b">clbr</span>
<a name="198" /><span class="Maybe">     198:</span> 
<a name="199" /><span class="Maybe">     199:</span> <span class="m">struct</span> <span class="b">paravirt_patch_site</span><span class="f">;</span>
<a name="200" /><span class="False">     200:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_PARAVIRT</span>
<a name="201" /><span class="False">     201:</span> <span class="m">void</span> <span class="b">apply_paravirt</span><span class="f">(</span><span class="m">struct</span> <span class="b">paravirt_patch_site</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span>
<a name="202" /><span class="False">     202:</span>             <span class="m">struct</span> <span class="b">paravirt_patch_site</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="f">#</span><span class="n">else</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">apply_paravirt</span><span class="f">(</span><span class="m">struct</span> <span class="b">paravirt_patch_site</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span>
<a name="205" /><span class="Maybe">     205:</span>                   <span class="m">struct</span> <span class="b">paravirt_patch_site</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span>
<a name="206" /><span class="Maybe">     206:</span> <span class="f">{</span><span class="f">}</span>
<a name="207" /><span class="Maybe">     207:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wYXJhaW5zdHJ1Y3Rpb25zXzA_"><span class="b">__parainstructions</span></a>    <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a>
<a name="208" /><span class="Maybe">     208:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wYXJhaW5zdHJ1Y3Rpb25zX2VuZF8w"><span class="b">__parainstructions_end</span></a>    <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a>
<a name="209" /><span class="Maybe">     209:</span> <span class="f">#</span><span class="n">endif</span>
<a name="210" /><span class="Maybe">     210:</span> 
<a name="211" /><span class="Maybe">     211:</span> <span class="m">extern</span> <span class="m">void</span> <span class="f">*</span><span class="b">text_poke_early</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">addr</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">opcode</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="212" /><span class="Maybe">     212:</span> 
<a name="213" /><span class="Maybe">     213:</span> <span class="k">/*</span>
<a name="214" /><span class="Maybe">     214:</span> <span class="k"> * Clear and restore the kernel write-protection flag on the local CPU.</span>
<a name="215" /><span class="Maybe">     215:</span> <span class="k"> * Allows the kernel to edit read-only pages.</span>
<a name="216" /><span class="Maybe">     216:</span> <span class="k"> * Side-effect: any interrupt handler running between save and restore will have</span>
<a name="217" /><span class="Maybe">     217:</span> <span class="k"> * the ability to write to read-only pages.</span>
<a name="218" /><span class="Maybe">     218:</span> <span class="k"> *</span>
<a name="219" /><span class="Maybe">     219:</span> <span class="k"> * Warning:</span>
<a name="220" /><span class="Maybe">     220:</span> <span class="k"> * Code patching in the UP case is safe if NMIs and MCE handlers are stopped and</span>
<a name="221" /><span class="Maybe">     221:</span> <span class="k"> * no thread can be preempted in the instructions being modified (no iret to an</span>
<a name="222" /><span class="Maybe">     222:</span> <span class="k"> * invalid instruction possible) or if the instructions are changed from a</span>
<a name="223" /><span class="Maybe">     223:</span> <span class="k"> * consistent state to another consistent state atomically.</span>
<a name="224" /><span class="Maybe">     224:</span> <span class="k"> * On the local CPU you need to be protected again NMI or MCE handlers seeing an</span>
<a name="225" /><span class="Maybe">     225:</span> <span class="k"> * inconsistent instruction while you patch.</span>
<a name="226" /><span class="Maybe">     226:</span> <span class="k"> */</span>
<a name="227" /><span class="Maybe">     227:</span> <span class="m">extern</span> <span class="m">void</span> <span class="f">*</span><span class="b">text_poke</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">addr</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">opcode</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="228" /><span class="Maybe">     228:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">poke_int3_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">)</span><span class="f">;</span>
<a name="229" /><span class="Maybe">     229:</span> <span class="m">extern</span> <span class="m">void</span> <span class="f">*</span><span class="b">text_poke_bp</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">addr</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">opcode</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">len</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">handler</span><span class="f">)</span><span class="f">;</span>
<a name="230" /><span class="Maybe">     230:</span> 
<a name="231" /><span class="True">     231:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_ALTERNATIVE_H */</span>
<a name="232" /><span class="True">     232:</span> </pre>
  </body>
</html>
